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

📄 myedlin.c

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