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

📄 blockfil.h

📁 简单的Dos界面的文本编辑器
💻 H
字号:


#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
//int current=1;
//The struct of the Block
struct Block
{  char area[512];   //to save lines 
   char *rear;       //pointe to the valid end of the block
   int  charcount;   //sign how many charactors in the block
   int  linecount;   //sign how many lines is the block
   int  endline;     //the index of the line in end ofthe block
};
class BlockFile
{
  private:
	  Block *bpointer[128];
	  char *lpointer[512];
	  int lcount;             //how many lines is in memory now
	  int bcount;             //how many blocks is in memory now
	  int linfor[512][3];     //linfor[i][0] sign line i in is which block, such as line lpointer[i] is in linfor[i][0]
	                          //linfor[i][1] sign the index of the line after line i in the same block, if not, linfor[i][1]=-1
	                          //linfor[i][2] sign the index of the line before line i in the same block, if not,linfor[i][2]=-1
	  void Format(Block *bp);
  public:	  
	  BlockFile(void);
	  ~BlockFile(void);
	  int InsertLine(char* input,int lnum);
	  int DeleteLine(int lnum);          //return if the line is deleted correctly
	  int GetLcnt(void);                 //to get the count of the line
	  char* GetLine(int lnum);           // get the line refered   	  
};

BlockFile::BlockFile(void)
{
	lcount=0;
    bcount=1;
	//BlockFile::current=0;
    for( int lnum=0; lnum<512; lnum++ )
	{
		lpointer[lnum]=NULL;
		linfor[lnum][0]=-1;
		linfor[lnum][1]=-1;
		linfor[lnum][2]=-1;
    }
	bpointer[0]=new Block;
    if(bpointer[0]==NULL)
	{
		cout<<"Memory allocation error"<<endl;
		exit(1);
    }
    Format(bpointer[0]);
	// cout<<"c"<<endl;
}

BlockFile::~BlockFile(void)
{ 
	int posi;
	for( posi=0; posi<bcount; posi++ )
	{
		delete bpointer[posi];
	}
	for( posi=0; posi<512; posi++ )
	{
		lpointer[posi]=NULL;
		linfor[posi][0]=-1;
		linfor[posi][1]=-1;
		linfor[posi][2]=-1;
	}
	bcount=0;
	lcount=0;	
	// cout<<"d"<<endl;
}
void BlockFile::Format(Block *bp)
{
    bp->rear=bp->area;
    for(int posi=0; posi<512; posi++ )
	{
		bp->area[posi]='\0';
    }
    bp->linecount=0;
    bp->charcount=0;
	bp->endline=-1;    
}
//Insert line input after line lnum 
int BlockFile::InsertLine(char* input,int lnum)
{
	int length=strlen(input);
	int posi=0;	
	if( lnum<0||lnum>lcount )
	{
		return (-1);
	}
	if( (lcount+length/128+1)>512)
	{
		return (-2);
	} //memory is exceeded 

	if(lnum>=0 && (lcount+length/128+1)<=512 )
	{
		if( length/128>0 )
			return -1;
		if( length/128==0 )
		{
			for( posi=lcount-1; posi >= lnum; posi-- )
			{
				if(lcount!=0)
				{
					lpointer[posi+1]=lpointer[posi];
				}
			}// after it, posi equal line lnum,it's value is lnum-1;
			//which block is available
			for(posi=0; posi<bcount; posi++)
			{
				if( (512-bpointer[posi]->charcount) > length+1 )
				{
					break;
				}
			}
			if(posi==bcount)
			{
				bpointer[bcount]=new Block;
				Format(bpointer[bcount]);
				bcount++;
			}		
			//block posi is available
			strcpy( bpointer[posi]->rear,input );
			bpointer[posi]->linecount++;
			lpointer[lnum]=bpointer[posi]->rear;
			//modify line information after the line insert
			for(int i=lcount-1; i>=lnum; i--)
			{
				if(lcount!=0)
				{
					linfor[i+1][0]=linfor[i][0];
					linfor[i+1][1]=linfor[i][1];
					linfor[i+1][2]=linfor[i][2];
				}
			}
 			for( i=0; i<=lcount; i++)
			{
				if(linfor[i][1]>=lnum)
					linfor[i][1]++;
				if(linfor[i][2]>=lnum)
					linfor[i][2]++;
			}////			
			for(i=0;i<bcount;i++)
			{
				if(bpointer[i]->endline>=lnum)
					bpointer[i]->endline++;
			}
			if(bpointer[posi]->endline!=-1)
			{
				linfor[lnum][2]=bpointer[posi]->endline;
				linfor[bpointer[posi]->endline][1]=lnum;				
			}
			else
			{
				linfor[lnum][2]=-1; //line lnum is the first line in the block				
			}			
			linfor[lnum][1]=-1;    //sign lnum is the last line in the block
			bpointer[posi]->endline=lnum;
			linfor[lnum][0]=posi;
			if( input[length-1]!='\n' )
			{
				strcat(lpointer[lnum],"\n");
				bpointer[posi]->rear+=length+1;
				bpointer[posi]->charcount+=length+1;
			}			
			else
			{
				*(lpointer[lnum]+length)=NULL;
				bpointer[posi]->rear+=length;
				bpointer[posi]->charcount+=length;
			}		
			//linfor[linfor[bpointer[posi]->endline][2]][1]=lnum-1;
			lcount++;
			//BlockFile::current=lnum+signfile[0][0]-1;  //the array index +1			
		}	
	}
	return 0;
}

//The function delete/////////////////
int BlockFile::DeleteLine(int lnum)
{
	int i=0,length=0,posi;
	char *temp1,*temp2;
	if(lnum<1 || lnum>lcount)
	{
		return -1;
	}
	temp1=lpointer[lnum-1];
	temp2=lpointer[linfor[lnum-1][1]];
	if( linfor[lnum-1][1]!=-1 )  // line lnum is not the last line in the block
	{
		length=strlen(temp1)-strlen(temp2);
		strcpy(temp1,temp2);		
	}
	else  //line lnum is the last line in the block
	{
		length=strlen(temp1);		
	}
	lpointer[lnum-1]="";
	posi=linfor[lnum-1][0];
	int j=linfor[lnum-1][1];
	//////////////////!!!!!!!!!!
	while(1)         //move the line after line lnum-1 in block posi forward
	{	
		if(j!=-1)
		{
			lpointer[j]-=length;
			if( j==bpointer[posi]->endline )
				break;			
			j=linfor[j][1];
		}
		else
			break;/////////////////!!!!!!!!!!!!!!or move after move pointer!!!!!!!!!!1
	}	
	for( i=lnum-1; i<lcount-1; i++ )  //modify line pointer forward
	{
		lpointer[i]=lpointer[i+1];			
	}
	bpointer[posi]->charcount-=length;
	bpointer[posi]->linecount--;	
	bpointer[posi]->rear-=length;
	*(bpointer[posi]->rear)=NULL;
	/*if(bpointer[posi]->linecount!=0)
	{   //block posi's endline sign the line before endline in the same block
		if(bpointer[posi]->endline>lnum-1)
		bpointer[posi]->endline=linfor[bpointer[posi]->endline][2];
	}*/
	if(bpointer[posi]->endline==lnum-1)
			bpointer[posi]->endline=linfor[bpointer[posi]->endline][2];
	if(linfor[lnum-1][2]!=-1)
	{
		linfor[linfor[lnum-1][2]][1]=linfor[lnum-1][1];
	}
	else
	{
		if(linfor[lnum-1][1]!=-1)
			linfor[linfor[lnum-1][1]][2]=-1;
	}
	if(linfor[lnum-1][1]!=-1)
	{
		linfor[linfor[lnum-1][1]][2]=linfor[lnum-1][2];
	}
	else
	{
		if(linfor[lnum-1][2]!=-1)
			linfor[linfor[lnum-1][2]][1]=-1;
	}
	for( i=lnum-1; i<lcount-1; i++ )  //modify line information
	{	
		linfor[i][0]=linfor[i+1][0];
		linfor[i][1]=linfor[i+1][1];
		linfor[i][2]=linfor[i+1][2];
	}
	for(i=0; i<lcount-1; i++)
	{
		if(linfor[i][1]>lnum-1)
			linfor[i][1]--;
		if(linfor[i][2]>lnum-1)
			linfor[i][2]--;
	
	}
	linfor[i][0]=-1;
	linfor[i][1]=-1;
	linfor[i][2]=-1;	
	for( i=0; i<bcount; i++ )
	{		
		if( (bpointer[i]->endline >lnum-1) )
			bpointer[i]->endline--;
	}
	lcount--;
	lpointer[lcount]="";
	//if a block is empty,free it,
	if(bpointer[posi]->linecount==0)
	{
		Block *temp_bpointer=bpointer[posi];
		for( i=posi; i<bcount-1; i++ )
		{
			bpointer[i]=bpointer[i+1];
		}
		bpointer[bcount-1]=temp_bpointer;
		delete bpointer[bcount-1];
		bcount--;
		for(i=0;i<lcount;i++)
		{
			if(linfor[i][0]>posi)
				linfor[i][0]--;
		}		
	}
	return 0;
}
/////////////////////////////////////////////////
//The function getline
//return the context with the true lnum,it means line 1 is line 1 accepted
char* BlockFile::GetLine(int lnum)
{    
	char str[128]="",*st;
    st = new char[128];
	int temp;
    if(lnum<=lcount)
	{
		strncpy(str,lpointer[lnum-1],128);
		for(temp=0;temp<128;temp++)
		{
			if( str[temp]=='\n' )
			{
				str[++temp]=NULL;				
				break;				
			}
		}
		strcpy(st,str);
	}
    return st;
}
int BlockFile::GetLcnt(void)
{
	return lcount;
}

⌨️ 快捷键说明

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