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

📄 te_file.c

📁 用BC++3.1编的C语言文本编辑器
💻 C
字号:
#include "te.h"

int NewFile(void)      /*重新编辑*/
{
TEXTLINE *ptx,*ptx1;
if(ptext)ptx=ptext->pnext;
else ptx=NULL;
while(ptx)
{
 ptx1=ptx->pnext;
 if(ptx->str)farfree(ptx->str);
 farfree(ptx);
 ptx=ptx1;
}
if(ptext)
{
 if(ptext->str)
  farfree(ptext->str);
}
else
 ptext=(TEXTLINE *)farmalloc(sizeof(TEXTLINE));
if(ptext==NULL)
  NeedMem(1);
memset(ptext,0,sizeof(TEXTLINE));
pcurtx=ptext;
pindex=ptext;
cur_x=0;
cur_y=0;
offset_x=0;
offset_y=0;
isModify=0;
scpy(szFilePath,"NONAME");
return 0;
}

int LoadFile(void)      /*载入文件*/
{char szTemp[1024],*pTemp,c,is_save,szFileName[15];
int len,i,j;
unsigned long l;
FILE *pfile;
pcurtx=ptext;
SetFileName(szFileName);
pfile=(FILE *)fopen(szFilePath,"rb+");
if(pfile==NULL)
   {
    isReadOnly=0;
    pfile=(FILE *)fopen(szFilePath,"r");
    if(pfile==NULL)
     {
      sprintf(szTemp,"\t\x2 Not exist File:\r\t\x8%s\r\t\x2 Create it?  ~Y=Yes ~N=No",szFileName);
      i=MsgBox(szTemp," \xfe Error",2,35,0x3e34,1,"\x1\x15\x31\0");
      if(i==KEY_Y)
       {
	pfile=(FILE *)fopen(szFilePath,"w");
	if(pfile==NULL)
	{
	 sprintf(szTemp,"\t\x2 Create file  %s  error\r\r\t\x5 \vAny key to continue...",szFileName);
	 MsgBox(szTemp," \xfe Error",2,40,0x3F34,0,NULL);
	 scpy(szFileName,"NONAME");
	 scpy(szFilePath,"NONAME");
	 return 1;
	}
       }
       else
	{
	 scpy(szFileName,"NONAME");
	 scpy(szFilePath,"NONAME");
	 return 1;
	}
     }
    else
     {
      sprintf(szTemp,"\r\t\x5 file %s is ReadOnly \r\t\x5 \vPress any key continue...",szFileName);
      isReadOnly=1;
      MsgBox(szTemp," \xfe WARNNING",2,40,0x3F34,0,NULL);
     }
   }
is_save=0;
len=0;
fseek(pfile,0,SEEK_END);
l=ftell(pfile);
if(l==0)return 0;
if(l>500000l)
 {
  NeedMem(0);
  return 0;
  }
fseek(pfile,0,SEEK_SET);
while(!feof(pfile))
{
 szTemp[len]=fgetc(pfile);
 if(szTemp[len]=='\t')
 {j=8-len%8;
  for(i=0;i<j;i++)
    {
     if(len==1000)break;
     szTemp[len]=' ';
     len++;
    }
  len--;
 }
 if(szTemp[len]=='\xa')
    {
     if(szTemp[len-1]=='\xd')len--;
     is_save=1;
    }
 else len++;
 if(len>=1000)is_save=1;
 if(is_save)
 {
  if(len)
  {
   pcurtx->str=(char *)farmalloc(len+1);
   if(pcurtx->str==NULL)
      NeedMem(1);
   sncpy(pcurtx->str,szTemp,len);

  }
  else pcurtx->str=NULL;
  pcurtx->pnext=(TEXTLINE *)farmalloc(sizeof(TEXTLINE));
  if(pcurtx->pnext==NULL)
	NeedMem(1);
  memset(pcurtx->pnext,0,sizeof(TEXTLINE));
  pcurtx->pnext->plast=pcurtx;
  pcurtx=pcurtx->pnext;

  len=0;
  is_save=0;
  memset(szTemp,0,1024);
 }

}
fclose(pfile);
ptext->plast=NULL;
pcurtx=ptext;
pindex=ptext;
offset_x=0;
offset_x=0;
return 0;
}

int SetFileName(char *filename)
{
 char szTemp[MAXPATH],szTemp1[10];
 if(filename==NULL)return 1;
 fnsplit(szFilePath,NULL,NULL,szTemp,szTemp1);
 if(szTemp1[0])
  {
   scat(szTemp,szTemp1);
  }
 scpy(filename,szTemp);
 return 0;
}

int SaveFile(int is_ask)          /*存文件*/
{
FILE *pfile;
TEXTLINE *ptx;
char szTemp[100],filename[20];
int len,i;
if(is_ask)
 {
  i=MsgBox("\t\x2 File has not been saved? Save it?\r\r\t\x8 ~Y=Yes   ~N=No   ~C=Cancel\0",
   " \xfe WARNNIG! ",2,40,0x3F34,1,"\x1\x15\x31\x2e\x0");
  switch(i)
  {
   case ESC:
   case KEY_C:
   case KEY_N:
      return i;
  }
}

pfile=fopen(szFilePath,"wb+");
if(pfile==NULL)
{
 SetFileName(filename);
 sprintf(szTemp,"\t\x2 Cannot create file:\r\t\x5 \v%s\v\r\t\x2 Any key to return...",filename);
 MsgBox(szTemp," \xfe Error",2,30,0x5F5e,0,NULL);
 return 1;
}
ptx=ptext;
while(ptx)
{len=slen(ptx->str);
 if(len)
  {
    i=fwrite(ptx->str,1,len,pfile);
    while(i!=len)
     {
      i=MsgBox("\t\x2 Write file error\t\x5 ~R=Retry  ~C=Cancel"," \xfe Error",
       2,30,0x5F5e,1,"\x1\x13\x2e\0");
       if(i!=KEY_R)
	{i=0;break;}
      i=fwrite(ptx->str,1,len,pfile);
     }
    if(i!=len)
     {fclose(pfile);
      return 1;
     }
  }
 if(ptx->str)
  fwrite("\xd\xa",1,2,pfile);
 else if(ptx->pnext)
  fwrite("\xd\xa",1,2,pfile);
 ptx=ptx->pnext;
}
fclose(pfile);
isModify=0;
return 0;
}

int AskFileName(char *pFileName,char *szTitle,int mode) /*得到文件名*/
{
char *buff,szTemp[MAXPATH];
int x0=10,y0=8,x1=70,y1=12,i,cur_x=0,len=0,offset=0,ret=1;
struct text_info tf;
KEYCODE kc;
buff=(char *)farmalloc((x1-x0+2)*(y1-y0+2)*2);
if(buff==NULL)
{NeedMem(0);
 return 0;
}
gettextinfo(&tf);
gettext(x0,y0,x1+1,y1+1,buff);
box(x0,y0,x1,y1,3,0x5e,1);
outs(x0+2,y0+1,0x5F,0,szTitle);
outs(x0+2,y0+3,0x5F,0x5b,"\vEnter\v=OK \vESC\v=Cancel");
window(x0+2,y0+2,x1-2,y0+2);
textattr(0x0f);
clr();
for(i=0;i<MAXPATH;i++)szTemp[i]=0;
if(mode)
{
 strcpy(szTemp,pFileName);
 len=slen(szTemp);
}
do
{
 gotoxy(cur_x+1,1);
 for(i=0;i<x1-x0-4;i++)
  {
   if(i<len)
	 outxy(i+x0+2,y0+2,0x0F,szTemp[offset+i]);
   else  outxy(i+x0+2,y0+2,0x0F,' ');
  }
 getkey(&kc);
 switch(kc.code)
 {
  case ESC:
   ret=1;
   break;
  case RIGHT:
   if(offset+cur_x>=len)break;
   if(cur_x==x1-x0-4)
     offset++;
   else cur_x++;
   break;
  case LEFT:
   if(cur_x==0&&offset==0)break;
   if(cur_x)cur_x--;
   else offset--;
   break;
  case HOME:
   cur_x=0;
   offset=0;
   break;
  case END:
   if(len>x1-x0-4)cur_x=x1-x0-4;
   else cur_x=len;
   offset=len-cur_x;
   offset=len-cur_x;
   break;
  case DEL:
   if(cur_x+offset==len)break;
   cur_x++;
  case BACKSPACE:
   if(cur_x==0&&offset==0)break;
   scpy(szTemp+offset+cur_x-1,szTemp+offset+cur_x);
   if(cur_x)cur_x--;
   else offset--;
   len--;
   break;
  case ENTER:
   scpy(pFileName,szTemp);
   ret=0;
   kc.code=ESC;
   break;
  case UP:
  case DOWN:
  case PAGEUP:
  case INSERT:
  case PAGEDOWN:
   break;
  default:
   if(kc.c==NULL||len==MAXPATH)break;
   szTemp[offset+cur_x]=kc.c;
   if(cur_x+offset==len)
     len++;
   if(cur_x<x1-x0-4)cur_x++;
   else offset++;
   break;
 }

}
while(kc.code!=ESC);

puttext(x0,y0,x1+1,y1+1,buff);
farfree(buff);
window(tf.winleft,tf.wintop,tf.winright,tf.winbottom);
textattr(tf.attribute);
clrkey();
gotoxy(tf.curx,tf.cury);
cur(cur_type);
return ret;
}

⌨️ 快捷键说明

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