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

📄 codearea.c

📁 linux 下类似于TC功能的编译器,但还没有完成,希望大家共同研究
💻 C
📖 第 1 页 / 共 3 页
字号:
			modified=TRUE;			if(insertmode)	//insert mode			{				if(totalcol+1<CODE_QUANTUM)				{					for(i=0;i<totalcol-curcol;i++)					{						page->data[line][totalcol-i]=page->data[line][totalcol-i-1];					}					page->data[line][curcol]=COLOR_PAIR(GetColor())|key;					totalcol++;					maxcol=(maxcol>totalcol)?(maxcol):(totalcol);					if(tempx+1>=GetWidth())					{						offcol++;						ShowPage(offcol*TABSIZE);						wmove(basewin,tempy,tempx-TABSIZE+1);					}					else					{						ShowLine(page->data[line],curcol,GetWidth()-tempx,tempy,tempx);						wmove(basewin,tempy,tempx+1);					}					curcol++;					ret = UPDATE_STATUS;				}			}			else		//replace mode			{				if(curcol+1<CODE_QUANTUM)				{					if(curcol+1>totalcol)	//new character					{						totalcol++;						maxcol=(maxcol>totalcol)?(maxcol):(totalcol);					}					if(tempx+1>=GetWidth())					{						offcol++;						page->data[line][curcol]=COLOR_PAIR(GetColor())|key;						ShowPage(offcol*TABSIZE);						wmove(basewin,tempy,tempx-TABSIZE+1);					}					else					{						page->data[line][curcol]=COLOR_PAIR(GetColor())|key;						waddch(basewin,COLOR_PAIR(GetColor())|key);					}					curcol++;					ret = UPDATE_STATUS;				}			}			break;		}	return ret;}void CodeArea::DestroyCodeArea(){	Trim();	DestroyBaseWindow();}int  CodeArea::Active(int item){	if(active!=TRUE)	{		active=TRUE;	}	return active;}int  CodeArea::Active(){	if (active!=TRUE)	{		active=TRUE;	}	if(insertmode)		curs_set(1);	else		curs_set(2);	ShowPage();	//wmove(basewin,currow,curcol);	return active;}int  CodeArea::IsActive(){	return active;}int  CodeArea::LostActive(){	if(active!=FALSE)	{		active=FALSE;	}	curs_set(0);	return active;}int  CodeArea::GetCurCol(){	return curcol;}int  CodeArea::GetCurRow(){	return currow;}int  CodeArea::GetTotalRow(){	return totalrow;}int  CodeArea::GetMaxCol(){	return maxcol;}int CodeArea::Trim(){	PageList  next, dptr;	next=NULL;	dptr=pagelist->next;	for (;dptr && dptr!=pagelist;dptr = next) 	{		next=dptr->next;		FreePage(dptr);	}	FreePage(pagelist);	return 0;}PageList CodeArea::AllocPage(){	int i;	PageList page=NULL;	if ((page=(PageList)malloc(sizeof(Page)))==NULL)		goto nomem_page;	page->quantum=CODE_QUANTUM;	page->qset=CODE_QSET;	page->data=NULL;	page->next=NULL;	page->prev=NULL;	if ( (page->data=(chtype **)malloc(sizeof(chtype *)*CODE_QSET)) ==NULL)		goto nomem_data;	memset(page->data, 0, sizeof(chtype *)*CODE_QSET);	for(i=0;i<CODE_QSET;i++)	{		page->data[i]=(chtype*)malloc(sizeof(chtype *)*CODE_QUANTUM);		if( page->data[i] ==NULL)			goto nomem_qset;		memset(page->data[i], 0, sizeof(chtype *)*CODE_QUANTUM);	}	goto success;nomem_qset:	while(i>0)	{		if(page->data[i-1])			free(page->data[i-1]);		i--;	}	free(page->data);	page->data=NULL;nomem_data:	free(page);	page=NULL;nomem_page:	return page;success:	return page;}void CodeArea::InsertPage(PageList prev,PageList newpage){	PageList next=prev->next;	prev->next=newpage;	newpage->prev=prev;	next->prev=newpage;	newpage->next=next;}void CodeArea::FreePage(PageList page){	int i=0;	PageList prev,next;	prev=page->prev;	next=page->next;	if (page->data)	{		for (i = 0; i <CODE_QSET; i++)			if (page->data[i])				free(page->data[i]);		free(page->data);		page->data=NULL;	}	if(page!=page->prev || page!=page->next)	{		prev->next=next;		next->prev=prev;		if(page==pagelist)		{			pagelist=next;		}	}	free(page);	page=NULL;}void CodeArea::ShowPage(){	int y,x;	getyx(basewin,y,x);	if ( (currow-y)<0)		{printf("\n%d %d %d",currow,y,currow-y);exit(1);}	ShowPage(NULL,(currow-y)%CODE_QSET,CODE_QSET,offcol*TABSIZE,GetWidth(),0,0);	wmove(basewin,y,x);}void CodeArea::ShowPage(int offcols){	int y,x;	getyx(basewin,y,x);	if ( (currow-y)<0 )		{endwin();printf("\n%d %d %d",currow,y,currow-y);exit(1);}	ShowPage(NULL,(currow-y)%CODE_QSET,CODE_QSET,offcols,GetWidth(),0,0);	wmove(basewin,y,x);}void CodeArea::ShowPage(PageList page,int beginline,int lines,int begincol,int cols,int y,int x){	int i, j;	int line=beginline%CODE_QSET;	int endcol=begincol + cols;	int begrow=y;	offline=line;	if(page==NULL)		page=beginpage;	else		beginpage=page;	for (i = 0; i < lines; i++) 	{		wmove (basewin, begrow, x);		for (j = begincol; j < endcol; j++)		{			if(j<CODE_QUANTUM && page->data[line][j]!='\0')				waddch (basewin,page->data[line][j]);			else				waddch (basewin,COLOR_PAIR(GetColor())|' ');		}		line++;		begrow++;		if(line>=CODE_QSET)		{			if(page->next!=pagelist)			{				page=page->next;			}			else			{				draw_box (begrow,0,GetHeight()-begrow,GetWidth(),COLOR_PAIR(GetColor())|' ',COLOR_PAIR(GetColor()));					break;			}			line=0;		}	}}void CodeArea::ShowLine(chtype *line, int beginpos, int chars, int row, int col){	int i=0;	for(i=0;i<chars;i++)	{		if(beginpos+i<totalcol && line[beginpos+i]!='\0')			mvwaddch(basewin,row,col,line[beginpos+i]);		else			mvwaddch(basewin,row,col,COLOR_PAIR(GetColor())|' ');		col++;	}	wrefresh(basewin);}//line:base on 0void CodeArea::ShiftLinesDown(PageList pg,int line,int shift){	PageList source=pagelist->prev;	PageList target=NULL;	int pages=(int)(totalrow/GetHeight())+1;	int lines=0;	int j=0;			//shifted pages	int i=0;//;	int rows=totalrow;	while(source!=pg)	{		lines=rows-(pages-1)*CODE_QSET;		rows=rows-lines;		while(lines>0)		{			j=(int)( (lines-1+shift)/CODE_QSET );//shift no.j line(start from 0)			target=source;			while(j>0)			{				target=target->next;				j--;			}			for(j=0;j<CODE_QUANTUM;j++)				target->data[(lines+shift-1)%CODE_QSET][j]=source->data[lines-1][j];			lines--;		}		source=source->prev;		pages--;	}	if(source==pg)	{		i=rows-(pages-1)*CODE_QSET;		lines=i-line-1;		while(lines>0)		{			j=(int)( (i-1+shift)/CODE_QSET );			target=source;			while(j>0)			{				target=target->next;				j--;			}			for(j=0;j<CODE_QUANTUM;j++)				target->data[(i-1+shift)%CODE_QSET][j]=source->data[i-1][j];			lines--;			i--;		}	}}void CodeArea::ShiftLinesUp(PageList pg,int line,int shift){	PageList source=pg;	PageList target=NULL;	int pageno=(int)(line/CODE_QSET)+1;	int pages=(int)((totalrow-1)/CODE_QSET)+1;	int frees=0;	int lines=0;	int k=0;	int j=0;	int i=0;	if(line%CODE_QSET==0)		goto skip;	line=(line)%CODE_QSET;	lines=(pageno<pages)?(CODE_QSET-line):(totalrow-(pageno-1)*CODE_QSET-line);	while(lines>0)	{		j=line-shift;		target=source;		while(j<0)		{			target=target->prev;			j=j+CODE_QSET;		}		for(k=0;k<CODE_QUANTUM;k++)		{			target->data[j][k]=source->data[line][k];			source->data[line][k]='\0';		}		line++;		lines--;	}	pageno++;	source=source->next;skip:	while(source!=pagelist)	{		lines=(pageno<pages)?(CODE_QSET):(totalrow-(pageno-1)*CODE_QSET);		for(i=0;i<lines;i++)		{			j=i-shift;			target=source;			while(j<0)			{				target=target->prev;				j=j+CODE_QSET;			}			for(k=0;k<CODE_QUANTUM;k++)			{				target->data[j][k]=source->data[i][k];				source->data[i][k]='\0';			}		}		source=source->next;		pageno++;	}	frees=(int)((totalrow-1)/CODE_QSET) - (int)((totalrow-1-shift)/CODE_QSET);	if( frees>0 )//need to free some pages	{		for(i=0;i<frees;i++)		{			if(pagelist->prev==beginpage)				beginpage=pagelist->prev->prev;			FreePage(pagelist->prev);		}	}	source=pagelist->prev;	shift=(totalrow-shift)%CODE_QSET;	if (shift==0)//shift==0 means beginpage points to a whole page		goto over;	for(i=shift;i<CODE_QSET;i++)		for(j=0;j<CODE_QUANTUM;j++)			source->data[i][j]='\0';over:	return;}void CodeArea::CopyLineDown(chtype *source,int begin,int len,chtype *target,int tarbeg,int shift,int clearup){	int i=0;	int line=currow%CODE_QSET;	int pages=(int)(shift/CODE_QSET);	PageList pg=LocatePage(NULL,currow);	if(source==NULL)		source=LocatePage(NULL,currow)->data[line];	if(target==NULL)	{		while(pages>0)		{			pg=pg->next;			pages--;		}		if((line+shift%CODE_QSET)>=CODE_QSET)			target=pg->next->data[(line+shift)%CODE_QSET];			else			target=pg->data[(line+shift)%CODE_QSET];		}	if(begin>=CODE_QUANTUM)		goto err;	if(begin+len>=CODE_QUANTUM)		goto err;	if(target==NULL || source==NULL)		goto err;	for(i=0;i<(CODE_QUANTUM-tarbeg-1);i++)	{		if(i<len)		{			target[tarbeg+i]=source[begin+i];			if(clearup==TRUE)				source[begin+i]='\0';		}		else			target[tarbeg+i]='\0';	}err:	return;	}void CodeArea::CopyLineUp(chtype *source,int begin,int len,chtype *target,int tarbeg,int shift,int clearup){	int i=0;	int line=currow%CODE_QSET;	int pages=(int)(shift/CODE_QSET);	PageList pg=LocatePage(NULL,currow);	if(source==NULL)		source=LocatePage(NULL,currow)->data[line];	if(target==NULL)	{		while(pages>0)		{			pg=pg->prev;			pages--;		}		if( line-shift%CODE_QSET <0 )			target=pg->prev->data[(line-shift+(pages+1)*CODE_QSET)%CODE_QSET];			else			target=pg->data[(line-shift%CODE_QSET)%CODE_QSET];	}	if(begin>=CODE_QUANTUM)		goto err;	if(begin+len>=CODE_QUANTUM)		goto err;	if(target==NULL || source==NULL)		goto err;	for(i=0;i<(CODE_QUANTUM-tarbeg-1);i++)	{		if(i<len)		{			target[tarbeg+i]=source[begin+i];			if(clearup==TRUE)				source[begin+i]='\0';		}		else			target[tarbeg+i]='\0';	}err:	return;	}PageList CodeArea::LocatePage(PageList page,int row){	int pg=(int)(row/CODE_QSET);	if(page==NULL)		page=beginpage;	else		beginpage=page;	while(pg>curpage)	{		page=page->next;		pg--;	}	while(pg<curpage)	{		page=page->prev;		pg++;	}	return page;	}int  CodeArea::GetCurColWidth(PageList page,int line){		int j=0;	page=LocatePage(page,line);	line=line % CODE_QSET;	while(page->data[line][j]!='\0')	{		if(page->data[line][j]=='\t')			j=j+TABSIZE;		else			j=j+1;	}	return (j<CODE_QUANTUM)?(j):(CODE_QUANTUM-1);}void CodeArea::linecolor(chtype *line){	int i, k,pos=0;	int wordbegin,wordend;	int color=GetColor();	char a[MAXIDLEN + 1];	char ch=line[pos];	char prech;again:	wordbegin=0;	wordend=0;	while(ch==' ' && pos+1<CODE_QUANTUM)	{		line[pos]=line[pos]|COLOR_PAIR(GetColor());			pos++;		ch=line[pos];	}	if(pos+1>=CODE_QUANTUM || ch=='\0')		goto over;	if (multiremark)	{		if(ch=='*')		{			line[pos]=line[pos]|COLOR_PAIR(COLOR_GREEN_BLUE);			GETCH(pos);			if(ch=='/')			{								line[pos]=line[pos]|COLOR_PAIR(COLOR_GREEN_BLUE);

⌨️ 快捷键说明

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