?? myedlin.c
字號(hào):
#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;
///////////////////////////////////////////////////////////////////////
// 在cp指向的行之后添加一行空行,出錯(cuò)則返回NULL
//
lineType* addNewLine(lineType *cp)
{
lineType *tp;
tp = (lineType *) malloc(sizeof(lineType));
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;
return tp;
}
///////////////////////////////////////////////////////////////////////////////
// 添加一個(gè)字符到鏈表中去
//
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;
}
///////////////////////////////////////////////////////////////////////////////
// 把文件的內(nèi)容讀到內(nèi)存中來(lái).
//
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)
{
BufferHead = BufferTail = NULL;
return;
}
while ((c = fgetc(fp)) != EOF)
{
// 添加一行新行到lineType鏈表
if (genNewLine)
{
CurrentLinePtr = addNewLine(CurrentLinePtr);
CurrentLineNum++;
genNewLine = 0;
}
// 添加一個(gè)字符到clistType鏈表
ccp = addCharToLine(ccp, c);
charcount++;
if (CurrentLinePtr->line == NULL)
CurrentLinePtr->line = ccp;
// 檢測(cè)換行標(biāo)志
if (c == '\n')
{
ccp = NULL;
genNewLine = 1;
}
}
fclose(fp);
LastLineNum = CurrentLineNum;
BufferTail = CurrentLinePtr;
}
///////////////////////////////////////////////////////////////////////////
// 將p指定的字符鏈表的內(nèi)容輸出到文件或屏幕(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;
}
////////////////////////////////////////////////////////////////////
// 把內(nèi)存中的內(nèi)容寫到文件
//
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;
}
/////////////////////////////////////////////////////////////////////////
// 根據(jù)三種基準(zhǔn)和偏移量在內(nèi)存中定位到具體的一行為當(dāng)前行
//
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;
}
///////////////////////////////////////////////////////////////////
// 從內(nèi)存中刪除指定的行
//
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);
//重新計(jì)算行號(hào)
if (CurrentLineNum == LastLineNum)
{
CurrentLineNum--;
LastLineNum--;
}
else
{
LastLineNum--;
}
return 1;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////
// 在第line_no行之后插入一行文本,line_no為行號(hào)
//
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++)
{
if (genNewLine)
{
CurrentLinePtr = addNewLine(CurrentLinePtr);
CurrentLineNum++;
genNewLine = 0;
}
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;
}
////////////////////////////////////////////////////////////////////////////
// 復(fù)制文本行
//
int sc_C(int startln, int endln, int toln)
{
clistType *cp;
clistType *ccp = NULL;
int line;
int genNewLine;
int copy_behind=toln>endln?1:0;
if (startln==CurrentLineNum && endln==CurrentLineNum)
{
cp = CurrentLinePtr->line;
for(genNewLine=1; cp!=NULL; cp=cp->next)
{
// add a new line to lineType link list
if (genNewLine)
{
SeekPos(toln, SEEK_SET);
CurrentLinePtr = addNewLine(CurrentLinePtr);
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -