📄 myedlin.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
typedef struct clistTag
{
char c;
struct clistTag *next, *prev;
} clistType;
typedef struct lineTag
{
clistType *line;
struct lineTag *next, *prev;
} lineType;
char Currentfname[BUFSIZ];
lineType *BufferHead = NULL;
lineType *BufferTail = NULL;
lineType *CurrentLinePtr = NULL;
int CurrentLineNum = 0;
int LastLineNum = 0;
char CmdStr[128];
char ParaArray[5][128];
int ParaCount;
#define APPEND 1 // insert after
#define INSERT 2 // insert before
///////////////////////////////////////////////////////////////////////
// 添加一行空行,mode指明了是在cp之前(INSERT)还是之后(APPEND)添加,如果出错
// 则返回NULL
//
lineType* addNewLine(lineType *cp, int mode)
{
lineType *tp;
tp = (lineType *) malloc(sizeof(lineType));
if (mode == APPEND) // append after *cp
{
if (cp != NULL)
{
tp->next = cp->next;
tp->prev = cp;
tp->line = NULL;
if (cp->next != NULL)
cp->next->prev = tp;
else
BufferTail = tp;
cp->next = tp;
}
else
{
tp->next = NULL;
tp->prev = NULL;
tp->line = NULL;
BufferHead = tp;
}
tp->prev = cp;
}
else // Insert before *cp
{
tp->next = cp;
if (cp != NULL)
{
if (cp->prev != NULL)
cp->prev->next = tp;
else
BufferHead = tp;
tp->prev = cp->prev;
cp->prev = tp;
}
else
{
BufferHead = BufferTail = tp;
tp->prev = NULL;
}
}
return tp;
}
///////////////////////////////////////////////////////////////////////////////
// 添加一个字符到链表中去
clistType * addCharToLine(clistType *cp, char c)
{
clistType *tp;
tp = (clistType *) malloc(sizeof(clistType));
tp->next = NULL;
tp->prev = cp;
tp->c = c;
if (cp != NULL)
cp->next = tp;
return tp;
}
///////////////////////////////////////////////////////////////////////////////
// 把文件的内容读到内存中来.
void ReadFile(void)
{
FILE *fp;
char c;
int genNewLine = 1, charcount = 0;
clistType *ccp = NULL;
CurrentLineNum = 0;
CurrentLinePtr = NULL;
if ((fp = fopen(Currentfname, "r")) == NULL)
{
//// printf("New File\n");
BufferHead = BufferTail = NULL;
return;
}
while ((c = fgetc(fp)) != EOF)
{
// add a new line to lineType link list
if (genNewLine)
{
CurrentLinePtr = addNewLine(CurrentLinePtr, APPEND);
CurrentLineNum++;
genNewLine = 0;
}
// add char to clistType link list
ccp = addCharToLine(ccp, c);
charcount++;
if (CurrentLinePtr->line == NULL)
CurrentLinePtr->line = ccp;
// check for new line condition
if (c == '\n')
{
ccp = NULL;
genNewLine = 1;
}
}
fclose(fp);
//// printf("%d\n", charcount);
LastLineNum = CurrentLineNum;
BufferTail = CurrentLinePtr;
}
///////////////////////////////////////////////////////////////////////////
// 将p指定的字符链表的内容输出到文件或屏幕(stdout)
int Println(FILE *fp, clistType *p, int linenum)
{
int charcount = 0;
int nlFound = 0;
if (linenum)
fprintf(fp, "%6d: ", linenum);
while (p != NULL)
{
fprintf(fp, "%c", p->c);
nlFound = p->c == '\n' ? 1 : 0;
p = p->next;
charcount++;
}
// if (nlFound == 0 && fp == stdout)
if (nlFound == 0)
fprintf(fp, "\n");
return charcount;
}
////////////////////////////////////////////////////////////////////
// 把内存中的内容写到文件
int WriteFile(char *filename)
{
char *fname;
int charcount = 0;
FILE *fp;
lineType *lp = BufferHead;
fname = (filename == NULL) ? Currentfname : filename;
if ((fp = fopen(fname, "w")) == NULL)
{
fprintf(stdout, "Unable to write to file %s\n", fname);
return -1;
}
while (lp != NULL)
{
charcount += Println(fp, lp->line, 0);
lp = lp->next;
}
//// printf("Wrote %d\n", charcount);
return charcount;
}
/////////////////////////////////////////////////////////////////////////
// 可采取三种方式在内存中对编辑的内容进行定位,即定位到具体的哪一行
int SeekPos(int offset, int origin)
{
lineType *p;
int line, lineno;
switch (origin)
{
default:
case SEEK_SET:
p = BufferHead;
line = offset; // only positive offsets
lineno = 1;
break;
case SEEK_CUR:
p = CurrentLinePtr;
line = CurrentLineNum + offset; // +- offsets
lineno = CurrentLineNum;
break;
case SEEK_END:
p = BufferTail;
line = LastLineNum - offset; // only positive offsets
lineno = LastLineNum;
break;
}
if (line > 0 && line <= LastLineNum)
{
while (p != NULL)
{
if (lineno == line)
{
CurrentLineNum = lineno;
CurrentLinePtr = p;
return lineno;
}
switch (origin)
{
default:
case SEEK_SET:
p = p->next;
lineno++;
break;
case SEEK_CUR:
if (offset < 0)
{
p = p->prev;
lineno--;
}
else
{
p = p->next;
lineno++;
}
break;
case SEEK_END:
p = p->prev;
lineno--;
break;
}
}
}
return 0;
}
///////////////////////////////////////////////////////////////////
// 从内存中删除指定的行
int DeleteLine(int lineno)
{
SeekPos(lineno,SEEK_SET);
if (CurrentLinePtr != NULL)
{
clistType *tcp, *cp = CurrentLinePtr->line;
lineType *lp;
while (cp != NULL) // free each char in line
{
tcp = cp->next;
free(cp);
cp = tcp;
}
if (CurrentLinePtr->prev != NULL)
CurrentLinePtr->prev->next = CurrentLinePtr->next;
if (CurrentLinePtr->next != NULL)
CurrentLinePtr->next->prev = CurrentLinePtr->prev;
lp = CurrentLinePtr;
if (CurrentLinePtr->next != NULL)
{
// guard against deleting first line
if (CurrentLinePtr == BufferHead)
BufferHead = CurrentLinePtr->next;
CurrentLinePtr = CurrentLinePtr->next;
}
else
{
CurrentLinePtr = CurrentLinePtr->prev;
BufferTail = CurrentLinePtr;
if (BufferTail == NULL) // check for last line == head
BufferHead = NULL;
}
free(lp);
//RecalcLineNum(CurrentLinePtr);
if (CurrentLineNum == LastLineNum)
{
CurrentLineNum--;
LastLineNum--;
}
else
{
LastLineNum--;
}
return 1;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////
// 在第line_no行之后插入一行文本,line_no为行号
//
void sc_I(int line_no)
{
char str[128];
int i;
clistType *ccp = NULL;
int genNewLine = 1;
SeekPos(line_no, SEEK_SET); // 定位于line_no行
gets(str);
for(i=0;str[i]!='\0';i++)
{
// add a new line to lineType link list
if (genNewLine)
{
CurrentLinePtr = addNewLine(CurrentLinePtr, APPEND);
CurrentLineNum++;
genNewLine = 0;
}
// add char to clistType link list
ccp = addCharToLine(ccp, str[i]);
if (CurrentLinePtr->line == NULL)
{
CurrentLinePtr->line = ccp;
}
}
if (line_no == LastLineNum)
{
LastLineNum = CurrentLineNum;
BufferTail = CurrentLinePtr;
}
else
{
LastLineNum++;
}
}
/////////////////////////////////////////////////////////////////////////
// 删除start_line_no行与end_line_no行之间的文本
//
void sc_D(int start_line_no, int end_line_no)
{
int line = end_line_no-start_line_no;
int i;
for (i=0; i<=line; i++)
{
DeleteLine(start_line_no);
}
}
/////////////////////////////////////////////////////////////////////////
// 显示start_line_no行与end_line_no行之间的文本
//
void sc_L(int start_line_no, int end_line_no)
{
int i;
if (start_line_no==CurrentLineNum && end_line_no==CurrentLineNum)
{
Println(stdout, CurrentLinePtr->line, CurrentLineNum);
}
else
{
for (i=start_line_no; i<=end_line_no; i++)
{
SeekPos(i, SEEK_SET);
Println(stdout, CurrentLinePtr->line, CurrentLineNum);
}
}
}
/////////////////////////////////////////////////////////////////////////
// 搜索指定的文本
//
int sc_S(int startln, int endln, char* schtext)
{
clistType *cp;
char current_line_text[255];
char *result;
int i;
int lineno;
if (startln==CurrentLineNum && endln==CurrentLineNum)
{
cp = CurrentLinePtr->line;
for(i=0; i<255; i++)
{
if (cp != NULL)
{
current_line_text[i] = cp->c;
cp = cp->next;
}
else
{
break;
}
}
if (i==255 && cp==NULL)
{
printf("Error! The number of character exceeds 255!\n");
return 0;
}
result = strstr(current_line_text, schtext);
if (result)
{
Println(stdout, CurrentLinePtr->line, CurrentLineNum);
return (result-current_line_text+1);
}
}
else
{
for (lineno=startln; lineno<=endln; lineno++)
{
SeekPos(lineno, SEEK_SET);
cp = CurrentLinePtr->line;
for(i=0; i<255; i++)
{
if (cp != NULL)
{
current_line_text[i] = cp->c;
cp = cp->next;
}
else
{
break;
}
}
if (i==255 && cp==NULL)
{
printf("Error! The number of character exceeds 255!\n");
return 0;
}
result = strstr(current_line_text, schtext);
if (result)
{
Println(stdout, CurrentLinePtr->line, CurrentLineNum);
return (result-current_line_text+1);
}
}
}
printf("%s not found!\n", schtext);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -