?? myedlin.c
字號(hào):
CurrentLineNum++;
genNewLine = 0;
}
// add char to clistType link list
ccp = addCharToLine(ccp, cp->c);
if (CurrentLinePtr->line == NULL)
{
CurrentLinePtr->line = ccp;
}
}
if (toln == LastLineNum)
{
LastLineNum = CurrentLineNum;
BufferTail = CurrentLinePtr;
}
else
{
LastLineNum++;
}
}
else
{
if (toln>=startln && toln<=endln) return 0; // 如果目的行在起始行和中止行之間則不拷貝
for (line=startln; line<=endln; line++)
{
if (copy_behind)
{
SeekPos(line, SEEK_SET);
}
else
{
SeekPos(line+line-startln, SEEK_SET);
}
cp = CurrentLinePtr->line;
for(genNewLine=1,ccp=NULL; cp!=NULL;cp = cp->next)
{
// add a new line to lineType link list
if (genNewLine)
{
SeekPos(toln+line-startln, SEEK_SET);
CurrentLinePtr = addNewLine(CurrentLinePtr);
CurrentLineNum++;
genNewLine = 0;
}
// add char to clistType link list
ccp = addCharToLine(ccp, cp->c);
if (CurrentLinePtr->line == NULL)
{
CurrentLinePtr->line = ccp;
}
}
if (copy_behind)
{
LastLineNum = CurrentLineNum;
BufferTail = CurrentLinePtr;
}
else
{
LastLineNum++;
}
}
}
return 1;
}
/////////////////////////////////////////////////////////////////////////
// 移動(dòng)文本塊
//
void sc_M(int startln, int endln, int toln)
{
if (toln>=startln && toln<=endln) return;
sc_C(startln, endln, toln);
if (toln > endln)
{
sc_D(startln, endln);
}
else
{
sc_D(startln+endln-startln+1, endln+endln-startln+1);
}
}
/////////////////////////////////////////////////////////////////////////
// 查找到后,替換文本
//
void sc_R(int startln, int endln, char* schtext, char* rpltext)
{
int pos;
int st_length;
int i;
clistType *last_ch_address;
clistType *next_ch_address;
clistType *cp;
clistType *tp;
pos = sc_S(startln, endln, schtext);
cp = CurrentLinePtr->line;
st_length = strlen(schtext);
if (pos)
{
for (i=1; i<pos; i++)
{
cp = cp->next;
}
last_ch_address = cp->prev;
for (i=0; i<st_length; i++)
{
tp = cp->next;
free(cp);
cp = tp;
}
next_ch_address = cp;
cp = last_ch_address;
for (i=0; rpltext[i]!='\0'; i++)
{
cp = addCharToLine(cp, rpltext[i]);
}
cp->next = next_ch_address;
next_ch_address->prev = cp;
}
}
/////////////////////////////////////////////////////////////////////////
// 退出
//
void sc_Q()
{
char c;
do
{
printf("Abort edit (Y/N)?");
c = toupper(getche());
printf("\n");
} while (c!='Y' && c!='N');
if (c == 'Y')
{
if (LastLineNum)
{
sc_D(1, LastLineNum);
}
exit(0);
}
}
//////////////////////////////////////////////////////////////////////////
// 保存并退出
//
void sc_E()
{
WriteFile(Currentfname);
if (LastLineNum)
{
sc_D(1, LastLineNum);
}
exit(0);
}
//////////////////////////////////////////////////////////////////////
// 顯示命令幫助
//
void sc_H()
{
printf("Copy\t\t\tC,[line_no,|[startline, endline,]]toline\n");
printf("Delete\t\t\tD[,line_no|[,startline, endline]]\n");
printf("End(save file)\t\tE\n");
printf("Help\t\t\tH\n");
printf("Insert\t\t\tI[,line_no]\n");
printf("List\t\t\tL[,line_no|[,startline, endline]]\n");
printf("Move\t\t\tM,[line_no,|[startline, endline,]],toline\n");
printf("Quit\t\t\tQ\n");
printf("Replace\t\t\tR,[line_no,|[startline, endline,]]oldtext,newtext\n");
printf("Search\t\t\tS,[line_no,|[startline, endline,]]searchtext\n");
}
////////////////////////////////////////////////////////////////////
// 解析命令
//
void ParseCommand()
{
int comma_count;
int i,j;
char c;
char *result;
for (comma_count=0,i=0; CmdStr[i]!='\0'; i++)
{
if (CmdStr[i] == ',')
{
comma_count++;
}
}
ParaCount = comma_count+1;
ParaArray[0][0] = CmdStr[0];
for (i=1; i<ParaCount; i++)
{
for (j=0,result=CmdStr; j<i; j++)
{
result = strpbrk(result, ",");
result++;
}
strcpy(ParaArray[i], result);
for (j=0; ParaArray[i][j]!='\0'; j++)
{
if (ParaArray[i][j] == ',') ParaArray[i][j] = '\0';
}
}
c = ParaArray[0][0];
if (c >= 97) c = c-32; // 轉(zhuǎn)換c為大寫(xiě)的命令字符
switch (c)
{
case 'I':
if (ParaCount > 2)
{
printf("error command");
return;
}
else if (ParaCount == 2)
{
int templn = atoi(ParaArray[1]);
if (templn == 0)
{
printf("error command\n");
return;
}
sc_I(templn);
}
else
{
sc_I(CurrentLineNum);
}
break;
case 'L':
if (ParaCount > 3)
{
printf("error command\n");
return;
}
else if (ParaCount == 3)
{
int startln = atoi(ParaArray[1]);
int endln = atoi(ParaArray[2]);
if (startln==0 || endln==0)
{
printf("error command\n");
return;
}
sc_L(startln, endln);
}
else if (ParaCount == 2)
{
int templn = atoi(ParaArray[1]);
if (templn == 0)
{
printf("error command\n");
return;
}
sc_L(templn, templn);
}
else
{
if (CurrentLineNum)
{
sc_L(CurrentLineNum, CurrentLineNum);
}
else
{
printf("Empty!\n");
return;
}
}
break;
case 'D':
if (ParaCount > 3)
{
printf("error command\n");
return;
}
else if (ParaCount == 3)
{
int startln = atoi(ParaArray[1]);
int endln = atoi(ParaArray[2]);
if (startln==0 || endln==0)
{
printf("error command\n");
return;
}
sc_D(startln, endln);
}
else if (ParaCount == 2)
{
int templn = atoi(ParaArray[1]);
if (templn == 0)
{
printf("error command\n");
return;
}
sc_D(templn, templn);
}
else
{
if (CurrentLineNum)
{
sc_D(CurrentLineNum, CurrentLineNum);
}
else
{
printf("No line can be deleted!\n");
return;
}
}
break;
case 'S':
if (ParaCount == 2)
{
sc_S(CurrentLineNum, CurrentLineNum, ParaArray[1]);
}
else if (ParaCount == 4)
{
int startln, endln;
startln = atoi(ParaArray[1]);
endln = atoi(ParaArray[2]);
if (startln==0 || endln==0)
{
printf("Error command!\n");
return;
}
sc_S(startln, endln, ParaArray[3]);
}
else
{
printf("Error command!\n");
return;
}
break;
case 'C':
if (ParaCount == 2)
{
int toln;
toln = atoi(ParaArray[1]);
if (toln == 0)
{
printf("error command\n");
return;
}
sc_C(CurrentLineNum, CurrentLineNum, toln);
}
else if (ParaCount == 4)
{
int startln, endln, toln;
startln = atoi(ParaArray[1]);
endln = atoi(ParaArray[2]);
toln = atoi(ParaArray[3]);
if (startln==0 || endln==0 || toln==0)
{
printf("error command\n");
return;
}
sc_C(startln, endln, toln);
}
else
{
printf("error command\n");
return;
}
break;
case 'M':
if (ParaCount == 2)
{
int toln;
toln = atoi(ParaArray[1]);
if (toln == 0)
{
printf("error command\n");
return;
}
sc_M(CurrentLineNum, CurrentLineNum, toln);
}
else if (ParaCount == 4)
{
int startln, endln, toln;
startln = atoi(ParaArray[1]);
endln = atoi(ParaArray[2]);
toln = atoi(ParaArray[3]);
if (startln==0 || endln==0 || toln==0)
{
printf("error command\n");
return;
}
sc_M(startln, endln, toln);
}
else
{
printf("error command\n");
return;
}
break;
case 'R':
if (ParaCount == 5)
{
int startln, endln;
startln = atoi(ParaArray[1]);
endln = atoi(ParaArray[2]);
if (startln==0 || endln==0)
{
printf("error command\n");
return;
}
sc_R(startln, endln, ParaArray[3], ParaArray[4]);
}
else if (ParaCount == 4)
{
int lineno = atoi(ParaArray[1]);
if (lineno ==0)
{
printf("error command\n");
return;
}
sc_R(lineno, lineno, ParaArray[2], ParaArray[3]);
}
else if (ParaCount == 3)
{
sc_R(CurrentLineNum, CurrentLineNum, ParaArray[1], ParaArray[2]);
}
else
{
printf("error command\n");
return;
}
break;
case 'Q':
sc_Q();
break;
case 'E':
sc_E();
break;
case 'H':
sc_H();
break;
default:
printf("Invalid command!\n");
break;
}
}
////////////////////////////////////////////////////////////////////////////////
// 程序入口
//
int main(int argc, char* argv[])
{
if (argc != 2)
{
printf("\nFilename is missing!\n");
exit(0);
}
else
{
strcpy(Currentfname,argv[1]);
ReadFile();
}
for(;;)
{
putch('*');
gets(CmdStr);
ParseCommand();
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -