📄 edit.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 + -