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

📄 edit.cpp

📁 一个basic语言的编译工具。
💻 CPP
字号:
#include"type.cpp"      /*-- Designed by LiYi in 2000--*/


/*-----------------FUNC-----------------*/
void BOX(uchar,uchar,uchar,uchar,uchar);
void CPUTCHAR(uchar c,uchar x,uchar y,uchar a);
uint getcur();
void setcur(uint n);
uchar QUIT();
void GETS(uchar *a);
void extname(uchar*f);
void CBOX(uchar,uchar,uchar,uchar,uchar);
void MSBOX(uint x1,uint y1,uint x2,uint y2,uchar*a1,uchar*a2);

/*-----------------CODE-----------------*/
void EDIT::createdit(uchar far*fn)
{uint b,i,j;

 ISCH=0;
 ADCUR(0);
 strupr(fn);
 strcpy(e.fn,fn);
 e.fl=e.x=e.y=e.first=0;
}

void EDIT::dispedit()
{uchar t,tn,j;uint l,i,i2;uchar huge*p;

 gotoxy(XO,YO);
 l=e.len;
 for(i=e.aline[FL],j=FL;i<l&&j<YL;j++,i=e.aline[j])
 {
  tn=e.aline[j+1]-e.aline[j];
  if(e.aline[j+1]==0xffff)
  {
   for(i2=j;i2<YL;i2++)
    puttext(XO,YO+i2,XO+XL-2,YO+i2,nl);
   LCP();
   return;
  }

  p=ns;ns[0]=0;
  for(i2=0;i2<tn;i2++,i++)
  {
   if(*(e.t+i)=='\n')*(p++)=17;
   else
    if(*(e.t+i)==0)*(p++)=254;
    else  *(p++)=*(e.t+i);
  }
  *p=0;

  gotoxy(XO,YO+j);
  printf("%s",ns);
  if(tn<XL)
   puttext(XO+tn,YO+j,XO+XL-1,YO+j,nl);
 }
 LCP();
}

uchar EDIT::edit()
{uint k2,i,j,n;uchar k;cur c;

 DRAW();
 makenl();
 c.savecur();
 FL=0;
 dispedit();
 c.storecur();

 for(;;)
 {
  gotoxy(e.x+XO,e.y+YO);
  k2=bioskey(0);
  k=k2&0x00ff;
  if(k==0x0d)k='\n';
  if(k==8)k=127;
  switch(k2)
  {
   case 0x4800:k2=1;break;/*   UP   */
   case 0x5000:k2=2;break;/*   DN   */
   case 0x4b00:k2=3;break;/*   LT   */
   case 0x4d00:k2=4;break;/*   RT   */
   case 0x5300:k2=5;break;/*  DEL   */
   case 0x4f00:k2=6;break;/*  END   */
   case 0x4700:k2=7;break;/*  HOME  */
   case 0x8400:k2=8;break;/* CHOME  */
   case 0x7600:k2=9;break;/*  CEND  */
   case 0x1519:k2=10;break;/*  ^Y   */
   case 0x4900:k2=11;break;/* PGUP  */
   case 0x5100:k2=12;break;/* PGDN  */
   case 0x3c00:k2=13;break;/* SAVE F2 */
   case 0x011b:k2=14;break;/*  ESC  */
   case 0x3d00:k2=15;break;/* OPEN F3 */
   case 0x3e00:k2=16;break;/* READ F4 */
   case 0x3f00:k2=17;break;/* NEW  F5 */
   case 0x4000:k2=18;break;/* NAME F6 */

   default:if((k2>=0x3b00)&&(k2<=0x4400))k2=(k2>>8)-0x3b+100;else k2=0;
  }

  c.savecur();
  switch(k2)
  {
   case 1:UPCUR();break;
   case 2:DNCUR();break;
   case 3:LTCUR();break;
   case 4:RTCUR();break;
   case 5:DEL();break;
   case 6:END();break;
   case 7:HOME();break;
   case 8:CHOME();break;
   case 9:CEND();break;
   case 10:CY();break;
   case 11:PGUP();break;
   case 12:PGDN();break;
   case 13:SVEDIT(1);break;
   case 14:if(QUIT())return 0;
	   break;
   case 15:OPENFILE();break;
   case 18:REN();break;
   case 17:NEW();break;
   case 16:READFILE();break;
   default:if(k2>=100){c.storecur();return k2-99;}
	   INSCHAR(k);
  }
  LCP();
  c.storecur();
 }
}

void EDIT::makenl()
{
 uint i;
 for(i=0;i<(XL<<1);)
 {nl[i++]=' ';nl[i++]=0X07;}
}

void EDIT::INSCHAR(uchar n)
{uint i,j,b,x3,y3;uchar c;

 if(n==0)return;
 ISCH=1;

/* ---  BACKSPACE ---  */
 if(n==127)
 {
  if(e.now==0){return;}
  movmem((void*)(e.t+e.now),(void*)(e.t+e.now-1),e.len-e.now-2);
  e.now--;
  if(e.y==0&&e.x==0)
  {
   ADCUR(-1);FL=0;dispedit();
   e.x=e.aline[1]-e.first-1;
   e.now=e.aline[1]-1;
   return;
  }
  if(e.x==0){e.y--;e.x=e.now-e.aline[e.y];}
       else  e.x--;
  FL=e.y;
  ADCUR(0);
  dispedit();
  return;
 }

 movmem((void*)(e.t+e.now),(void*)(e.t+e.now+1),e.len-e.now-2);
 *(e.t+e.now)=n;e.now++;

 /* - LETTERS - */

 if(n!='\n')
 {
  e.x++;
  if(e.x>=XL){e.x=0;e.y++;goto lop;}

  for(i=e.now;*(e.t+i)!='\n'&&*(e.t+i)!=0;i++);
   i-=e.now;
  if(i+e.x>=XL)goto lop;

  for(i=e.y+1;i<=YL;i++)
   if(e.aline[i]!=0xffff)
    e.aline[i]++;

  i=e.now-1;
  gotoxy(e.x-1+XO,e.y+YO);
  while((c=*(e.t+i))!='\n'&&*(e.t+i)!=0)putch(c),i++;
  if(c=='\n')putch(17);i++;
  if(c==0)putch(254);

  if((b=XL-(i-e.aline[e.y])-1)!=XL)
  {
   y3=wherey();x3=wherex();
   puttext(x3,y3,x3+b,y3,nl);
  }

  return;
 }

 /* - ENTER - */

 e.x=0;
 e.y++;
lop:
 ADCUR(1);

 gotoxy(e.x+XO,e.y+YO);
 if(e.y==YL-1)FL=0;
       else if(e.y)FL=e.y-1;
	       else FL=0;

 dispedit();
}

void EDIT::ADCUR(int n)
{
 int i,j,b,now;

 if(n==1)
 {i=1;
  while(e.y>=YL)              /*       ADCUR        */
  {
   e.first=e.aline[i++];
   e.y--;e.fl++;
  }
  ADCUR(0);
  return;
 }

 if(n==-1)
 {
  if(e.y==0)
  {
   e.first-=2;
   while( (*(e.t+e.first)!='\n') && (e.first!=0xffff))e.first--;
   e.first++;
   now=e.now;
   ADCUR(0);

   for(i=0;i<YL;i++)
   {
    if(e.aline[i]>now){i--;break;}
   }
   e.y=0;e.fl--;
   if(i){e.first=e.aline[i];ADCUR(0);}
  }
  ADCUR(0);
  return;
 }

 if(n==0)
 {
  for(i=e.first,j=0;j<=YL;j++,i++)
  {e.aline[j]=i;b=0;

   while(*(e.t+i)!=0&&*(e.t+i)!='\n')
   {if(b==XL-1)break;
    i++;b++;
   }

   if(*(e.t+i)==0)
   {e.aline[++j]=++i;
    j++;
    for(;j<=YL+2;j++)
     e.aline[j]=-1;
    break;
   }
  }
  e.now=e.aline[e.y]+e.x;

  return;
 }
}

void EDIT::UPCUR()
{uint i,i2;

 if( e.first==0 && e.y==0 )return;
 if(e.y)
 {
  e.y--;
  for(i2=i=e.aline[e.y];;i++)
  {
   if(e.aline[e.y+1]==i){i--;break;}
   if(i-i2==e.x)break;
  }
  e.x=i-i2;e.now=i;return;
 }
 else
 {
  e.now=e.aline[0]-1;
  ADCUR(-1);
  e.y=0;
  for(i2=i=e.first;;i++)
  {
   if(e.aline[1]==i){i--;break;}
   if(i-i2==e.x)break;
  }
  e.x=i-i2;e.now=i;
  FL=0;
  dispedit();
 }
}

void EDIT::DNCUR()
{uint i,i2;

 if(*(e.t+e.aline[e.y+1]-1)==0)return;

 if(e.aline[e.y+1]==0xffff)return;
 e.y++;
 if(e.y<YL)
 {
  for(i2=i=e.aline[e.y];;i++)
  {
   if(i==e.aline[e.y+1]){i--;break;}
   if(i-i2==e.x)break;
  }
  e.x=i-i2;e.now=i;return;
 }
 else
 {
  ADCUR(1);
  for(i2=i=e.aline[YL];;i++)
  {
   if(*(e.t+i)=='\n'&&*(e.t+i)==0)break;
   if(i-i2==e.x)break;
  }
  e.x=i-i2;e.now=e.aline[e.y]+e.x;
  FL=0;
  dispedit();
 }
}

void EDIT::LTCUR()
{uint i,i2;
 if(e.now==0)return;
 e.now--;
 if(e.now>(long)(e.first)-1)
 {
  if(e.x)
  {e.x--;return;}
  else
  {
   e.y--;
   e.x=e.aline[e.y+1]-e.aline[e.y]-1;
   return;
  }
 }
 ADCUR(-1);
 e.y=0;
 e.x=e.aline[1]-e.aline[0]-1;
 e.now=e.first+e.x;
 FL=0;
 dispedit();
}

void EDIT::RTCUR()
{uint i,i2;
 if(*(e.t+e.now)==0)return;
 if(e.now<e.aline[YL]-1)
 {
  if(e.now<e.aline[e.y+1]-1)
  {e.x++,e.now++;return;}
  else
  {
   e.y++;e.now++;
   e.x=0;
   return;
  }
 }
 e.y++;e.x=0;
 ADCUR(1);
 FL=0;
 dispedit();
}

void EDIT::DEL()
{
 ISCH=1;
 if(*(e.t+e.now)==0)return;
 movmem((void*)(e.t+e.now+1),(void*)(e.t+e.now),e.len-e.now-2);
 ADCUR(0);
 FL=e.y;
 dispedit();
}

void EDIT::SETXL(uint N)
{
 XL=N;
}

void EDIT::SETYL(uint N)
{
 YL=N;
}

void EDIT::END()
{
 e.x=e.aline[e.y+1]-e.aline[e.y]-1;
 e.now=e.aline[e.y+1]-1;
}

void EDIT::HOME()
{
 e.x=0;
 e.now=e.aline[e.y];
}

void EDIT::CHOME()
{
 e.x=e.y=0;e.now=0;e.fl=0;
 if(e.first){e.first=0;ADCUR(0);FL=0;dispedit();}
}

void EDIT::CEND()
{uint i,j;
 for(i=e.first;i<e.len;i++)
  if(*(e.t+i)==0)break;

 while(e.aline[YL-1]<=i){e.y=YL;ADCUR(1);}
 e.now=i;
 while(*(e.t+e.now-1)==0)e.now--;

 for(i=0;i<YL;i++)
  if(e.aline[i]>e.now)break;
 i--;
 e.y=i;e.x=e.now-e.aline[i];
 FL=0;

 dispedit();
 return;
}

void EDIT::CY()
{
 if(*(e.t+e.now)==0)return;
 movmem((void*)(e.t+e.aline[e.y+1]),(void*)(e.t+e.aline[e.y]),e.len-e.now-2);
 ADCUR(0);
 e.x=0;e.now=e.aline[e.y];

 FL=e.y;
 dispedit();
 ISCH=1;
}

void EDIT::PGUP()
{uint i=0,now;uchar x,y;
 x=e.x;y=e.y;now=e.now;
 e.y=e.x=0;
 while(e.first&&i<=YL){e.now=e.first-1;ADCUR(-1);i++;}
 if(now==e.now){e.now=e.x=e.y=0;}
 else
 {
  e.y=y;e.x=x;
  if(e.aline[y+1]-e.aline[y]<=x)e.x=e.aline[y+1]-e.aline[y]-1;
  e.now=e.aline[y]+e.x;
 }
 FL=0;
 dispedit();
}

void EDIT::PGDN()
{uint i,j=0,now;uchar x,y;
 x=e.x;y=e.y;

 if(e.aline[YL]==0xffff)
 {
  CEND();return;
 }
 for(i=0;i<YL;i++)
  if(e.aline[i]==0xffff)j++;
 j=YL-j;
 e.first=e.aline[j];e.fl+=j;
 ADCUR(0);
 while(e.aline[y]==0xffff)y--;
 e.y=y;e.x=x;

 if(e.aline[y+1]-e.aline[y]<=x)e.x=e.aline[y+1]-e.aline[y]-1;
 e.now=e.aline[y]+e.x;
 FL=0;
 dispedit();
}

uchar EDIT::LDEDIT(uchar*fn)
{
 uchar c,huge*p,huge*pz;FILE*fp;
 p=e.t;ISCH=0;pz=e.t+e.len;
 if((fp=fopen(fn,"rt"))!=0)
 {
  while(feof(fp)==0&&p<pz){c=getc(fp);if(c!=0&&c!=0xff)*(p++)=c;}
  *(p++)=0;*(p++)=0;*p=0;
  fclose(fp);
 }
 else *p=0;
 createdit(fn);
 return 0;
}

uchar EDIT::SVEDIT(uchar yn)
{
 uchar huge*p;FILE*fp;char tn[80];
 if(ISNAMED==0)
 {
  GETFN(tn,"SaveFileName");DRAW();
  if(tn[0]==27)return 1;
  strcpy(e.fn,tn);
 }
 if(yn)SVP(0);
 p=e.t;
 if((fp=fopen(e.fn,"wt"))==0)
 {
  MSBOX(25,9,53,14,"   Can`t open the file!"," Press any key to continue");
  getch();
  DRAW();
  if(yn)SVP(1);return 1;
 }
 fseek(fp,0,0);
 while(*p!=0)
  putc(*(p++),fp);
 putc(0,fp);
 fclose(fp);
 if(yn)SVP(1);
 ISCH=0;
 return 0;
}

/*-------------------------*/

void EDIT::SVP(uchar a)
{static uchar d[40];
 if(a==0)
 {
  gettext(XO+1,YO+YL,XO+20,YO+YL,d);
  gotoxy(XO+1,YO+YL);
  CBOX(XO,YO+YL-1,XO+8,YO+YL-1,0X5e);
  printf("Saving...");
 }
 else
 {
  puttext(XO+1,YO+YL,XO+20,YO+YL,d);
 }
}

void EDIT::LCP()
{
 CBOX(XO,YO-2,XO+15,YO-2,0x5e);
 gotoxy(XO+1,YO-1);
 printf("Line:%3d  Col:%2d屯屯",e.y+e.fl,e.x);
 CBOX(XO+XL-3-strlen(e.fn),YO-2,XO+XL-4,YO-2,0X5E);
 gotoxy(XO+XL-2-strlen(e.fn),YO-1);
 puts(e.fn);
}

void EDIT::OPENFILE()
{uchar a[80];
 GETFN(a,"  OpenFileName");
 if(a[0]==27)return;
 LDEDIT(a);
 DRAW();
}

void EDIT::GETFN(uchar*fn,char*t)
{uint i;uchar f[80];uchar *p;cur c;

 MSBOX(25,9,53,14,t,"");
 c.savecur();
 setcur(0x0d0e);
 gotoxy(27,13);putchar('>');GETS(f);
 strcpy(fn,f);
 this->DRAW();
 if(f[0]==0||f[0]==27)return;
 strupr(fn);
 extname(fn);
 ISNAMED=1;
 c.storecur();
}

void EDIT::DRAW()
{
 makenl();
 BOX(XO-2,YO-2,XO+XL-1,YO+YL-1,0X17);
 CBOX(XO-1,YO-1,XO+XL-2,YO+YL-2,0X07);
 FL=0;
 dispedit();
 CBOX(0,0,79,0,0X2f);
 CBOX(0,24,79,24,0X2f);
 gotoxy(20,1);puts(title);
 gotoxy(1,25);printf("F2:Save F3:Open F4:Read F5:New F6:ReName F9:Run ESC:Quit");
 gotoxy(XO+e.x,YO+e.y);
}

void EDIT::REN()
{char tn[80];
 GETFN(tn,"   NewName");
 if(tn[0]>' ')strcpy(e.fn,tn);
 DRAW();
}

void EDIT::NEW()
{
 *(e.t)=0;
 *(e.t+1)=0;
 *(e.t+2)=0;
 createdit("NONAME.BAS");
 ISNAMED=0;
 ADCUR(0);
 DRAW();
}

void EDIT::READFILE()
{uchar huge*p,a[80];FILE*f1,*f2;uchar c;
 uint first,now,fl;
 uchar x,y;
 first=e.first;now=e.now;fl=e.fl;x=e.x;y=e.y;
 GETFN(a,"  ReadFileName");
 if(a[0]<' '){DRAW();return;}
 if((f2=fopen(a,"rt"))!=0)
 {
  f1=fopen("SBASIC.TMP","wt");
  for(p=e.t;p<e.t+e.now&&*p!=0&&*p!=0xff;)
   putc(*(p++),f1);
  while(feof(f2)==0){c=getc(f2);if(c!=0&&c!=0XFF)putc(c,f1);}
  fclose(f2);
  for(;p<e.t+e.len&&*p!=0;)
   putc(*(p++),f1);
  fclose(f1);
  strcpy(a,e.fn);
  LDEDIT("SBASIC.TMP");
  strcpy(e.fn,a);
  e.first=first;e.now=now;e.fl=fl;e.x=x;e.y=y;
 }
 DRAW();
}

uchar EDIT::QUIT()
{cur c;uchar k;

 c.savecur();
 setcur(0x0d0e);
 if(ISCH==0)return 1;
 c.savecur();
 MSBOX(25,9,53,14,"Save the file before quit?"," (Y/N/ESC)?");
 k=getch();
 if(k==27){DRAW();c.storecur();return 0;}
 if(k=='y'||k=='Y')
  if(SVEDIT(1)){c.storecur();return 0;}
 c.storecur();
 return 1;
}

void extname(uchar*f)
{uchar*p,a=0;
 p=f;while(*(p++));
 while(*(--p)!='.')a++;
 if(a>4)strcat(f,".BAS");
}

void GETS(uchar far*a)
{uchar k2,x=0;uint k;
 for(;;)
 {
  while((k=bioskey(1))==0);
  k2=getch();
  switch(k2)
  {
   case 13:*(a+x)=0;return;
   case 27:putchar('\\');*a=27;return;
   case 8:if(x){x--;gotoxy(wherex()-1,wherey());putchar(' ');gotoxy(wherex()-1,wherey());}break;
   case 0:break;
   default:*(a+x)=k2;putchar(k);x++;
  }
 }
}

uint getcur()
{union REGS r;
 r.h.ah=3;r.h.bh=0;
 int86(0x10,&r,&r);
 return r.x.cx;
}

void setcur(uint n)
{union REGS r;
 r.h.ah=1;r.x.cx=n;
 int86(0x10,&r,&r);
}


void cur::savecur()
{
 cx=wherex();
 cy=wherey();
 cc=getcur();
 setcur(0xffff);
}

void cur::storecur()
{
 gotoxy(cx,cy);
 setcur(cc);
}

void BOX(uchar x1,uchar y1,uchar x2,uchar y2,uchar c)
{uchar i;

 CPUTCHAR('

⌨️ 快捷键说明

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