This repository has been archived on 2023-07-11. You can view files and clone it, but cannot push or open issues or pull requests.
fte/e_buffer.h

771 lines
21 KiB
C
Raw Normal View History

/* e_buffer.h
*
* Copyright (c) 1994-1996, Marko Macek
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
*
*/
#ifndef _BUFFER_H_
#define _BUFFER_H_
#define bmLine 0
#define bmStream 1
#define bmColumn 2
#define E_OK 0 // all ok
#define E_CANCEL 1 // operation cancelled
#define E_ERROR 2 // error
#define E_NOMEM 3 // out of memory
#define umDelete 0
#define umInsert 1
#define umSplitLine 2
#define umJoinLine 3
#define tmNone 0
#define tmLeft 1
#define tmRight 2
typedef unsigned char TransTable[256];
#ifdef DOS /* 16 bit, sometime ;-) */
#define RWBUFSIZE 8192
#else
#define RWBUFSIZE 32768
#endif
extern char FileBuffer[RWBUFSIZE];
#define ChClass(x) (WGETBIT(Flags.WordChars, (x)) ? 1 : 0)
#define ChClassK(x) (((x) == ' ' || (x) == 9) ? 2 : ChClass(x))
#define InRange(a,x,b) (((a) <= (x)) && ((x) < (b)))
#define Min(a,b) (((a) < (b))?(a):(b))
#define Max(a,b) (((a) > (b))?(a):(b))
#define NextTab(pos,ts) (((pos) / (ts) + 1) * (ts))
#define GapLine(x,g,c,a) (((x) < (g)) ? (x) : ((x) + (a) - (c)))
typedef class ELine* PELine;
typedef class EPoint* PEPoint;
#define CHAR_TRESHOLD 0x3U
class ELine {
public:
int Count;
char *Chars;
#ifdef CONFIG_SYNTAX_HILIT
hlState StateE;
#endif
ELine(int ACount, char *AChars);
ELine(char *AChars, int ACount);
~ELine();
int Allocate(unsigned int Bytes);
// int Length(EBufferFlags *CurFlags);
};
class EPoint {
public:
int Row;
int Col;
// EPoint(EPoint &M) { Row = M.Row; Col = M.Col; }
EPoint(int aRow = 0, int aCol = 0) { Row = aRow; Col = aCol; }
~EPoint() {}
};
typedef struct _UndoStack {
int NextCmd, Record, Undo;
int UndoPtr;
int Num;
void **Data;
int *Top;
} UndoStack;
#ifdef CONFIG_OBJ_ROUTINE
class RoutineView;
typedef struct _RoutineList {
int Count;
int *Lines;
} RoutineList;
#endif
#ifdef CONFIG_BOOKMARKS
2019-03-31 16:31:33 -04:00
typedef struct _EBookmark {
char *Name;
EPoint BM;
} EBookmark;
#endif
typedef struct {
int line;
unsigned char level;
unsigned char open;
unsigned short flags;
} EFold;
class EEditPort: public EViewPort {
public:
EBuffer *Buffer;
EPoint TP, OldTP;
EPoint CP;
int Rows, Cols;
EEditPort(EBuffer *B, EView *V);
virtual ~EEditPort();
virtual void HandleEvent(TEvent &Event);
virtual void HandleMouse(TEvent &Event);
virtual void UpdateView();
virtual void RepaintView();
virtual void UpdateStatus();
virtual void RepaintStatus();
virtual void Resize(int Width, int Height);
int SetTop(int Col, int Row);
virtual void GetPos();
virtual void StorePos();
void DrawLine(int L, TDrawBuffer B);
void ScrollY(int Delta);
void RedrawAll();
};
class EBuffer: public EModel {
public:
//char *Name;
char *FileName;
int Modified;
EPoint TP;
EPoint CP;
EPoint BB;
EPoint BE;
EPoint PrevPos;
EPoint SavedPos;
EBufferFlags Flags;
EMode *Mode;
int BlockMode;
int ExtendGrab;
int AutoExtend;
int Loaded;
#ifdef CONFIG_UNDOREDO
UndoStack US;
#endif
struct stat FileStatus;
int FileOk;
int Loading;
int RAllocated; // text line allocation
int RGap;
int RCount;
PELine *LL;
int VAllocated; // visible lines
int VGap;
int VCount;
int *VV;
#ifdef CONFIG_FOLDS
int FCount;
EFold *FF;
#endif
EPoint Match;
int MatchLen;
int MatchCount;
RxMatchRes MatchRes;
#ifdef CONFIG_BOOKMARKS
int BMCount;
EBookmark *BMarks;
#endif
#ifdef CONFIG_OBJ_ROUTINE
RoutineList rlst;
RoutineView *Routines;
#endif
int MinRedraw, MaxRedraw;
int RedrawToEos;
#ifdef CONFIG_WORD_HILIT
char **WordList;
int WordCount;
#endif
#ifdef CONFIG_SYNTAX_HILIT
SyntaxProc HilitProc;
int StartHilit, EndHilit;
#endif
// constructors
EBuffer(int createFlags, EModel **ARoot, const char *AName);
~EBuffer();
virtual void DeleteRelated();
virtual EViewPort *CreateViewPort(EView *V);
EEditPort *GetViewVPort(EView *V);
EEditPort *GetVPort();
virtual int CanQuit();
virtual int ConfQuit(GxView *V, int multiFile = 0);
virtual int GetContext();
virtual EEventMap *GetEventMap();
virtual int BeginMacro();
virtual int ExecCommand(int Command, ExState &State);
virtual void HandleEvent(TEvent &Event);
virtual void GetName(char *AName, int MaxLen);
virtual void GetPath(char *APath, int MaxLen);
virtual void GetInfo(char *AInfo, int MaxLen);
virtual void GetTitle(char *ATitle, int MaxLen, char *ASTitle, int SMaxLen);
PELine RLine(int No) {
#ifdef DEBUG_EDITOR
int N = GapLine(No, RGap, RCount, RAllocated);
if (!((No < RCount) && (No >= 0) && (LL[N]))) {
printf("Get No = %d/%d Gap=%d RAlloc = %d, VCount = %d\n", No, RCount, RGap, RAllocated, VCount);
assert((No < RCount) && (No >= 0) && (LL[N]));
}
#endif
return LL[GapLine(No, RGap, RCount, RAllocated)];
}
void RLine(int No, PELine L) {
#ifdef DEBUG_EDITOR
if (!((No >= 0))) printf("Set No = %d\n", No);
assert((No >= 0));
#endif
LL[GapLine(No, RGap, RCount, RAllocated)] = L;
}
int Vis(int No) {
#ifdef DEBUG_EDITOR
if (No < 0 || No >= VCount) {
printf("Vis get no %d of %d\n", No, VCount);
assert (No >= 0 && No < VCount);
}
#endif
return VV[GapLine(No, VGap, VCount, VAllocated)];
}
void Vis(int No, int V) {
#ifdef DEBUG_EDITOR
if (No < 0 || No >= VCount) {
printf("Vis set no %d of %d to %d\n", No, VCount, V);
assert (No >= 0 && No < VCount);
}
#endif
VV[GapLine(No, VGap, VCount, VAllocated)] = V;
}
PELine VLine(int No) {
#ifdef DEBUG_EDITOR
if (!((No < VCount) && (No >= 0))) {
printf("VGet No = %d\n", No);
assert((No < VCount) && (No >= 0));
}
if (Vis(No) < 0)
assert(1 == 0);
#endif
return RLine(No + Vis(No));
}
void VLine(int No, PELine L) {
#ifdef DEBUG_EDITOR
if (!((No >= 0))) {
printf("VSet No = %d\n", No);
assert((No >= 0));
}
if (VV[No] < 0)
assert(1 == 0);
#endif
RLine(No + Vis(No), L);
}
int VToR(int No) {
#ifdef DEBUG_EDITOR
if (!(No < VCount)) {
printf("Get No = %d\n", No);
assert((No < VCount));
}
#endif
return No + Vis(No);
}
int RToV(int No);
int RToVN(int No);
// allocation
int Allocate(int ACount);
int MoveRGap(int RPos);
int AllocVis(int ACount);
int MoveVGap(int VPos);
int Modify();
int Clear();
#ifdef CONFIG_UNDOREDO
int FreeUndo();
#endif
// internal primitives
int ValidPos(EPoint W);
int RValidPos(EPoint W);
int LoadRegion(EPoint *A, int FH, int StripChar, int LineChar);
int SaveRegion(EPoint *A, EPoint *Z, int FH, int AddCR, int AddLF, int Mode);
int AssertLine(int Line);
int InsertLine(EPoint Pos, int ACount, char *AChars);
int UpdateMarker(int Type, int Line, int Col, int Lines, int Cols);
int UpdateMark(EPoint &M, int Type, int Line, int Col, int Lines, int Cols);
void UpdateVis(EPoint &M, int Row, int Delta);
void UpdateVisible(int Row, int Delta);
int LoadFrom(char *AFileName);
int SaveTo(char *AFileName);
int IsBlockStart();
int IsBlockEnd();
int BlockType(int Mode);
int BeginExtend();
int EndExtend();
int CheckBlock();
int BlockRedraw();
int SetBB(EPoint M);
int SetBE(EPoint M);
int Load();
int Save();
int Reload();
int FilePrint();
int SetFileName(const char *AFileName, const char *AMode);
int SetPos(int Col, int Row, int tabMode = tmNone);
int SetPosR(int Col, int Row, int tabMode = tmNone);
int CenterPos(int Col, int Row, int tabMode = tmNone);
int CenterPosR(int Col, int Row, int tabMode = tmNone);
int SetNearPos(int Col, int Row, int tabMode = tmNone);
int SetNearPosR(int Col, int Row, int tabMode = tmNone);
int CenterNearPos(int Col, int Row, int tabMode = tmNone);
int CenterNearPosR(int Col, int Row, int tabMode = tmNone);
int LineLen(int Row);
int LineChars(int Row);
/////////////////////////////////////////////////////////////////////////////
// Undo/Redo Routines
/////////////////////////////////////////////////////////////////////////////
int NextCommand();
#ifdef CONFIG_UNDOREDO
int PushUData(void *data, int len);
int PushULong(unsigned long l);
int PushUChar(unsigned char ch);
int PopUData(void *data, int len);
int GetUData(int No, int pos, void **data, int len);
int Undo(int undo);
int Undo();
int Redo();
int BeginUndo();
int EndUndo();
int PushBlockData();
#endif
/////////////////////////////////////////////////////////////////////////////
// Primitive Editing
/////////////////////////////////////////////////////////////////////////////
//int ExpReg(int Row, int Ofs, int ACount, int &B, int &E);
int ScreenPos(ELine *L, int Offset);
int CharOffset(ELine *L, int ScreenPos);
int DelLine(int Row, int DoMark = 1);
int UnTabPoint(int Row, int Col);
int InsLine(int Row, int DoAppend, int DoMark = 1);
int DelChars(int Row, int Ofs, int ACount);
int InsChars(int Row, int Ofs, int ACount, char *Buffer);
int ChgChars(int Row, int Ofs, int ACount, char *Buffer);
int DelText(int Row, int Col, int ACount, int DoMark = 1);
int InsText(int Row, int Col, int ACount, char *Buffer, int DoMark = 1);
int InsLineText(int Row, int Col, int ACount, int Pos, PELine Line);
int SplitLine(int Row, int Col);
int JoinLine(int Row, int Col);
int CanUnfold(int Row);
int PadLine(int Row, int Length);
int ShowRow(int Row);
int HideRow(int Row);
int ExposeRow(int Row); // make row visible (open all folds containing)
/////////////////////////////////////////////////////////////////////////////
// Redraw/Windowing Routines
/////////////////////////////////////////////////////////////////////////////
void Draw(int Line0, int LineE);
void DrawLine(TDrawBuffer B, int L, int C, int W, int &HilitX);
void Hilit(int FromRow);
void Rehilit(int ToRow);
void Redraw();
void FullRedraw();
int GetHilitWord(int len, char *str, ChColor &clr, int IgnCase = 0);
/////////////////////////////////////////////////////////////////////////////
// Utility Routines
/////////////////////////////////////////////////////////////////////////////
int LineIndented(int Row);
int IndentLine(int Row, int Indent);
#ifdef CONFIG_SYNTAX_HILIT
int GetMap(int Row, int *StateLen, hsState **StateMap);
#endif
int FindStr(char *Data, int Len, int Options);
int FindRx(RxNode *Rx, int Options);
int Find(SearchReplaceOptions &opt);
int IsLineBlank(int Row);
int TrimLine(int Row);
#ifdef CONFIG_OBJ_ROUTINE
int ScanForRoutines();
#endif
/////////////////////////////////////////////////////////////////////////////
// Bookmark Routines
/////////////////////////////////////////////////////////////////////////////
#ifdef CONFIG_BOOKMARKS
int PlaceBookmark(char *Name, EPoint P);
int RemoveBookmark(char *Name);
int GetBookmark(char *Name, EPoint &P);
int GotoBookmark(char *Name);
#endif
/////////////////////////////////////////////////////////////////////////////
// Editing Routines
/////////////////////////////////////////////////////////////////////////////
int MoveLeft();
int MoveRight();
int MoveUp();
int MoveDown();
int MovePrev();
int MoveNext();
int MoveWordLeftX(int start);
int MoveWordRightX(int start);
int MoveWordLeft();
int MoveWordRight();
int MoveWordPrev();
int MoveWordNext();
int MoveWordEndLeft();
int MoveWordEndRight();
int MoveWordEndPrev();
int MoveWordEndNext();
int MoveWordOrCapLeft();
int MoveWordOrCapRight();
int MoveWordOrCapPrev();
int MoveWordOrCapNext();
int MoveWordOrCapEndLeft();
int MoveWordOrCapEndRight();
int MoveWordOrCapEndPrev();
int MoveWordOrCapEndNext();
// int MoveWordStart();
// int MoveWordEnd();
int MoveLineStart();
int MoveLineEnd();
int MovePageUp();
int MovePageDown();
int MovePageLeft();
int MovePageRight();
int MovePageStart();
int MovePageEnd();
int MoveFileStart();
int MoveFileEnd();
int MoveBlockStart();
int MoveBlockEnd();
int ScrollLeft(int Cols);
int ScrollRight(int Cols);
int ScrollDown(int Lines);
int ScrollUp(int Lines);
int MoveToLine();
int MoveToColumn();
int MoveFirstNonWhite();
int MoveLastNonWhite();
int MovePrevEqualIndent();
int MoveNextEqualIndent();
int MovePrevTab();
int MoveNextTab();
int MoveLineTop();
int MoveLineCenter();
int MoveLineBottom();
int MovePrevPos();
int MoveSavedPosCol();
int MoveSavedPosRow();
int MoveSavedPos();
int SavePos();
int MoveTabStart();
int MoveTabEnd();
int MoveFoldTop();
int MoveFoldPrev();
int MoveFoldNext();
int MoveBeginOrNonWhite();
int MoveBeginLinePageFile();
int MoveEndLinePageFile();
int KillLine();
int KillChar();
int KillCharPrev();
int KillWord();
int KillWordPrev();
int KillWordOrCap();
int KillWordOrCapPrev();
int KillToLineStart();
int KillToLineEnd();
int KillBlock();
int BackSpace();
int Delete();
int CompleteWord();
int KillBlockOrChar();
int KillBlockOrCharPrev();
#define ccUp 0
#define ccDown 1
#define ccToggle 2
int CharTrans(TransTable tab);
int CharCaseUp();
int CharCaseDown();
int CharCaseToggle();
int LineTrans(TransTable tab);
int LineCaseUp();
int LineCaseDown();
int LineCaseToggle();
int BlockTrans(TransTable tab);
int BlockCaseUp();
int BlockCaseDown();
int BlockCaseToggle();
int CharTrans(ExState &State);
int LineTrans(ExState &State);
int BlockTrans(ExState &State);
int GetTrans(ExState &State, TransTable tab);
int LineInsert();
int LineAdd();
int LineSplit();
int LineJoin();
int LineNew();
int LineIndent();
int LineTrim();
int LineCenter();
int FileTrim();
int BlockTrim();
#ifdef CONFIG_UNDOREDO
int CanUndo();
int CanRedo();
#endif
int LineLen();
int LineCount();
int CLine();
int CColumn();
int InsertChar(char aCh);
int TypeChar(char aCh);
int InsertString(char *aStr, int aCount);
int InsertSpacesToTab(int TSize);
int InsertTab();
int InsertSpace();
int SelfInsert();
#ifdef CONFIG_WORDWRAP
int DoWrap(int WrapAll);
int WrapPara();
#endif
int InsPrevLineChar();
int InsPrevLineToEol();
int LineDuplicate();
int GetMatchBrace(EPoint &M, int MinLine, int MaxLine, int show);
int MatchBracket();
int HilitMatchBracket();
int BlockBegin();
int BlockEnd();
int BlockUnmark();
int BlockCut(int Append);
int BlockCopy(int Append);
int BlockPaste();
int BlockKill();
int BlockIndent();
int BlockUnindent();
int BlockClear();
int BlockMarkStream();
int BlockMarkLine();
int BlockMarkColumn();
int BlockReadFrom(char *aFileName, int blockMode);
int BlockWriteTo(char *aFileName, int Append = 0);
int BlockExtendBegin();
int BlockExtendEnd();
int BlockReIndent();
int BlockIsMarked();
int BlockPasteStream();
int BlockPasteLine();
int BlockPasteColumn();
int BlockSelectWord();
int BlockSelectLine();
int BlockSelectPara();
int BlockPrint();
int BlockSort(int Reverse);
int ClipClear();
int BlockUnTab();
int BlockEnTab();
int ToggleAutoIndent();
int ToggleInsert();
int ToggleExpandTabs();
int ToggleShowTabs();
int ToggleUndo();
int ToggleReadOnly();
int ToggleKeepBackups();
int ToggleMatchCase();
int ToggleBackSpKillTab();
int ToggleDeleteKillTab();
int ToggleSpaceTabs();
int ToggleIndentWithTabs();
int ToggleBackSpUnindents();
int ToggleWordWrap();
int ToggleTrim();
int ToggleShowMarkers();
int SetLeftMargin();
int SetRightMargin();
int ShowPosition();
int Search(ExState &State, char *aString, int Options, int CanResume = 0);
int SearchAgain(ExState &State, unsigned int Options);
int SearchReplace(ExState &State, char *aString, char *aReplaceString, int Options);
int Search(ExState &State);
int SearchB(ExState &State);
int SearchRx(ExState &State);
int SearchAgain(ExState &State);
int SearchAgainB(ExState &State);
int SearchReplace(ExState &State);
int SearchReplaceB(ExState &State);
int SearchReplaceRx(ExState &State);
#ifdef CONFIG_WORD_HILIT
int HilitAddWord(const char *Word);
int HilitFindWord(const char *Word);
int HilitRemoveWord(const char *Word);
int HilitWord();
#endif
int SearchWord(int Flags);
#ifdef CONFIG_FOLDS
int FindFold(int Line);
int FindNearFold(int Line);
int FoldCreate(int Line);
int FoldCreateByRegexp(char *Regexp);
int FoldDestroy(int Line);
int FoldDestroyAll();
int FoldPromote(int Line);
int FoldDemote(int Line);
int FoldOpen(int Line);
int FoldOpenAll();
int FoldOpenNested();
int FoldClose(int Line);
int FoldCloseAll();
int FoldToggleOpenClose();
#endif
int ChangeMode(char *Mode);
int ChangeKeys(char *Mode);
int ChangeFlags(char *Mode);
int ScrollLeft(ExState &State);
int ScrollRight(ExState &State);
int ScrollDown(ExState &State);
int ScrollUp(ExState &State);
/* editor functions with user interface */
int MoveToColumn(ExState &State);
int MoveToLine(ExState &State);
int FoldCreateByRegexp(ExState &State);
#ifdef CONFIG_BOOKMARKS
int PlaceBookmark(ExState &State);
int RemoveBookmark(ExState &State);
int GotoBookmark(ExState &State);
#endif
int InsertString(ExState &State);
int SelfInsert(ExState &State);
int FileReload(ExState &State);
int FileSaveAs(char *FileName);
int FileSaveAs(ExState &State);
int FileWriteTo(char *FileName);
int FileWriteTo(ExState &State);
int BlockReadX(ExState &State, int BlockMode);
int BlockRead(ExState &State);
int BlockReadStream(ExState &State);
int BlockReadLine(ExState &State);
int BlockReadColumn(ExState &State);
int BlockWrite(ExState &State);
int Find(ExState &State);
int FindReplace(ExState &State);
int FindRepeat(ExState &State);
int FindRepeatOnce(ExState &State);
int FindRepeatReverse(ExState &State);
int InsertChar(ExState &State);
int TypeChar(ExState &State);
int ChangeMode(ExState &State);
int ChangeKeys(ExState &State);
int ChangeFlags(ExState &State);
int ChangeTabSize(ExState &State);
int ChangeRightMargin(ExState &State);
int ChangeLeftMargin(ExState &State);
#ifdef CONFIG_I_ASCII
int ASCIITable(ExState &State);
#endif
#ifdef CONFIG_TAGS
int FindTag(ExState &State);
int FindTagWord(ExState &State);
#endif
int SetCIndentStyle(ExState &State);
int FindFunction(int delta, int way);
int BlockMarkFunction();
int IndentFunction();
int MoveFunctionPrev();
int MoveFunctionNext();
int InsertDate(ExState& state);
int InsertUid();
int ShowHelpWord(ExState &State);
int PlaceGlobalBookmark(ExState &State);
int PushGlobalBookmark();
virtual int GetStrVar(int var, char *str, int buflen);
virtual int GetIntVar(int var, int *value);
int SetIndentWithTabs(ExState &State);
int FoldCreateAtRoutines();
};
extern EBuffer *SSBuffer;
extern SearchReplaceOptions LSearch;
extern int suspendLoads;
int DoneEditor();
EBuffer *FindFile(char *FileName);
#endif