⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myedlin.c

📁 一个小的行编译器程序
💻 C
📖 第 1 页 / 共 2 页
字号:
				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;
}

/////////////////////////////////////////////////////////////////////////
// 移动文本块
//
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; // 转换c为大写的命令字符

	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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -